<?php

namespace JsonLowCode\UI;

use JsonLowCode\Schema;
use JsonLowCode\Traits\Events\HasModelValueEvent;
use JsonLowCode\Traits\Props\HasClearable;
use JsonLowCode\Traits\Props\HasDefaultValue;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasModel;
use JsonLowCode\Traits\Props\HasPlacements;
use JsonLowCode\Traits\Props\HasShow;
use JsonLowCode\Traits\Props\HasSize;
use JsonLowCode\Traits\Props\HasTo;
use JsonLowCode\Traits\Props\HasValue;
use JsonLowCode\Traits\Slots\HasSlotFooter;

/**
 * @method TimePicker make()
 */
class TimePicker extends Schema
{
    protected string $componentName = "NTimePicker";

    use HasDefaultValue, HasClearable, HasDisabled, HasShow, HasSize, HasTo, HasValue, HasModel, HasPlacements;

    use HasModelValueEvent;

    /**
     * 通过数组指定显示的小时。当值为 number 时，将被当做时间步进处理
     * @param string|array|int $value number | number[]
     * @return $this
     */
    public function hours(string|array|int $value): static
    {
        return $this->prop("hours",$value);
    }

    /**
     * 通过数组指定显示的分钟。当值为 number 时，将被当做时间步进处理
     * @param string|array|int $value number | number[]
     * @return $this
     */
    public function minutes(string|array|int $value): static
    {
        return $this->prop("minutes",$value);
    }

    /**
     * 通过数组指定显示的秒。当值为 number 时，将被当做时间步进处理
     * @param string|array|int $value number | number[]
     * @return $this
     */
    public function seconds(string|array|int $value): static
    {
        return $this->prop("seconds",$value);
    }

    /**
     * Time Picker 中支持的操作
     * @param string|array|null $actions ['now', 'confirm'] | null
     * @return $this
     */
    public function actions(string|array|null $actions = ['now', 'confirm']): static
    {
        return $this->prop("actions",$actions);
    }

    /**
     * 用于禁用小时的回调函数
     * @param string $value (hour: number) => boolean
     * @return $this
     */
    public function isHourDisabled(string $value): static
    {
        return $this->events('is-hour-disabled', $value);
    }

    /**
     * 用于禁用分钟的回调函数，在没有选中值时，hour 是 null
     * @param string $value (minute: number, hour: number | null) => boolean
     * @return $this
     */
    public function isMinuteDisabled(string $value): static
    {
        return $this->events('is-minute-disabled', $value);
    }

    /**
     * 用于禁用秒钟的回调函数，在没有选中值时，minute 和 hour 是 null
     * @param string $value (second: number, minute: number | null, hour: number | null) => boolean
     * @return $this
     */
    public function isSecondDisabled(string $value): static
    {
        return $this->events('is-second-disabled', $value);
    }

    /**
     * 格式化值时使用的市区，遵循 iana time zones 格式。你可以使用 Intl.supportedValuesOf('timeZone') 来查看支持的时区
     * @param string $value
     * @return $this
     */
    public function timeZone(string $value): static
    {
        return $this->prop('time-zone', $value);
    }

    /**
     * 是否使用 12 小时制的面板
     * @param string|bool $bool
     * @return $this
     */
    public function use12Hours(string|bool $bool = true): static
    {
        return $this->prop('use-12-hours', $bool);
    }

    /**
     * Date Picker 格式化后默认值 string | [string, string] | null
     * @param string $value
     * @return $this
     */
    public function defaultFormattedValue(string $value): static
    {
        return $this->prop('default-formatted-value', $value);
    }

    /**
     * 格式化之后的值
     * @param string $value string | [string, string] | null
     * @return $this
     */
    public function formattedValue(string $value): static
    {
        return $this->prop('formatted-value', $value);
    }

    /**
     * 格式化
     * @param string $value string
     * @return $this
     */
    public function format(string $value): static
    {
        return $this->prop('format', $value);
    }


    /**
     * 文本输入的占位符 placeholder
     * @param string|array $placeholder
     * @return $this
     */
    public function placeholder(string|array $placeholder = ''): static
    {
        return $this->prop("placeholder",$placeholder);
    }

    /**
     * 验证状态
     * @param string $value 'success' | 'warning' | 'error'
     * @return $this
     */
    public function status(string $value = 'success' | 'warning' | 'error'): static
    {
        return $this->prop('status', $value);
    }


    /**
     * 绑定值的格式，详情见
     * @param string $value
     * @return $this
     */
    public function valueFormat(string $value): static
    {
        return $this->prop('value-format', $value);
    }


    /**
     * 设置输入框为只读（避免在移动设备上打开虚拟键盘）
     * @param string|bool $bool
     * @return $this
     */
    public function readonly(string|bool $bool = true): static
    {
        return $this->prop('input-readonly', $bool);
    }



    /**
     * 用户 confirm 时执行的回调
     * @param string $value (value: number | [number, number] | null, formattedValue: string | [string, string] | null) => void
     * @return $this
     */
    public function onConfirm(string $value = '(value, formattedValue) => void'): static
    {
        return $this->events('on-confirm', $value);
    }

    /**
     * 用户 blur 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onBlur(string $value = '() => {}'): static
    {
        return $this->events('on-blur', $value);
    }

    /**
     * 用户 focus 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onFocus(string $value = '() => {}'): static
    {
        return $this->events('on-focus', $value);
    }

    /**
     * 用户 clear 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onClear(string $value = '() => {}'): static
    {
        return $this->events('on-clear', $value);
    }


    /**
     * 图标
     * @param mixed $value
     * @return $this
     */
    public function slotIcon(mixed $value): static
    {
        return $this->slot('icon', $value);
    }

    /**
     * 发生改变时的回调函数
     * @param string $event 事件
     * @return $this
     */
    public function onUpdateFormattedValue(string $event = ""): static
    {
        return $this->events("onUpdate:formatted-value",$event);
    }
}
